/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.metier.utils.rss;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import java.util.Locale;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import net.etrs.formathlon.entity.formation.Session;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * Classe qui va s'occuper de la construction des différents documents XML de 
 * l'application.
 * @author OPIF
 */
public class XMLManager {
        static Locale locale = Locale.UK;
    
    /**
     * Methode qui va construire un xml au format rss contenant la liste des sessions
     * ouvertes à l'inscription.
     * @param sessions Liste des sessions ouvertes à l'inscription.
     * @return Le document xml construit en mémoire
     * @throws ParserConfigurationException 
     */
    public static Document transformToXML(List<Session> sessions) throws ParserConfigurationException {
        // Création d'un nouveau DOM
        DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
        DocumentBuilder constructeur = fabrique.newDocumentBuilder();
        Document document = constructeur.newDocument();

        // Propriétés du DOM
        document.setXmlVersion("1.0");
        document.setXmlStandalone(true);

        // Création de l'arborescence du DOM
        Element racine = document.createElement("rss");
        racine.setAttribute("version", "2.0");

        Element channel = document.createElement("channel");
        racine.appendChild(channel);

        Element title = document.createElement("title");
        title.setTextContent("Formathlon");
        channel.appendChild(title);

        Element description = document.createElement("description");
        description.setTextContent("A fond la formation");
        channel.appendChild(description);
        
        DateFormat dateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
     
        Element lastBuildDate = document.createElement("lastBuildDate");
        lastBuildDate.setTextContent(dateFormat.format((new Date())));
        channel.appendChild(lastBuildDate);

        Element link = document.createElement("link");
        link.setTextContent("http://localhost:8080/formathlon/fluxrss");
        channel.appendChild(link);

        // Creation des différents items
        for (Session s : sessions) {
            channel.appendChild(transformToXML(s, document));
        }

        // On attache tous au document
        document.appendChild(racine);

        return document;
    }

    /**
     * Methode qui va transformer en Element DOM les informations contenu dans une 
     * session.
     * @param s session à transformer en Element
     * @param document document ou l'on constuie le DOM
     * @return Element 
     */
    private static Element transformToXML(Session s, Document document) {

        
        // Element racine de l'element
        Element item = document.createElement("item");
        
        // Partie afficher dans la liste
        Element title = document.createElement("title");
        title.setTextContent(s.getFormation().getLibelle());
        item.appendChild(title);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
        
        Element pubDate = document.createElement("pubDate");
        pubDate.setTextContent(simpleDateFormat.format(s.getDateDebut()));
        item.appendChild(pubDate);

        Element description = document.createElement("description");
        description.setTextContent(s.getFormation().getDescription());
        item.appendChild(description);

        Element link = document.createElement("link");
        link.setTextContent("http://localhost:8080/formathlon/faces/pages/user/inscription/detail_session.xhtml?id="+Long.toString(s.getId()));
        item.appendChild(link);

        return item;
    }
    
    
}
